package com.AdvancedDemos.FileAndIO;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class 练习1_chatGPT实现 {
    public static void main(String[] args) throws IOException {

        /**
         * 1.键盘录入一个只包含数字和字母的字符串,并将字符串存储在当前模块下的
         * message.txt
         * 2.读取message.txt中的内容,统计其中每个字符出现的次数,
         * 并将统计结果存储在当前模块下的result.txt中
         * 格式:
         * 输入:aaabbbddccc
         * 结果:
         * a=3
         * b=3
         * c=3
         * d=2
         */

        // 键盘输入字符串并存储到message.txt
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入只包含数字和字母的字符串：");
        String inputStr = scanner.nextLine();
        File messageFile = new File("helloworld\\src\\message.txt");
        FileWriter fileWriter = new FileWriter(messageFile);
        fileWriter.write(inputStr);
        fileWriter.close();

        // 读取message.txt中的内容，并统计每个字符出现的次数
        Map<Character, Integer> resultMap = new HashMap<>();
        FileReader fileReader = new FileReader(messageFile);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            char[] chars = line.toCharArray();
            for (char c : chars) {
                if (!Character.isLetterOrDigit(c)) {//Character.isLetterOrDigit(char)判断某个字符是不是字母或数字,前面加非取反,所以当不是字母或数字时,就continue进入下一次for循环,即非数字非字母不计数,只统计字母和数字的个数
                    continue;
                }
                resultMap.put(c, resultMap.getOrDefault(c, 0) + 1);//这句最神奇,等价于
                /**if (resultMap.containsKey(c)) {
                 //表示该字符已经至少统计过一次了
                 resultMap.put(c, resultMap.get(c) + 1);
                 } else {
                 //表示该字符是第一次统计
                 resultMap.put(c, 1);
                 }*/
                /*resultMap.getOrDefault(c, 0)的意思是获取resultMap这个HashMap中的键c对应的那个值, 如果c还不在该HashMap中, 也就是说是第一次统计c这个字符, 那么就返回默认值defaultValue, 而这个默认值是由第二个参数给的, 这里是0, 所以当第一次统计字符c时, 就会返回0, 加上后面的 + 1, 就刚好是1, 然后put到了resultMap中, 等价于上面else中的resultMap.put(c, 1);
                而此后再次碰到字符c时, 因为c已经在HashMap中, resultMap.getOrDefault(c, 0)将会返回键c对应的那个值, 然后加上后面 + 1, 再put到resultMap中, 实现了第二次及以后遇到字符c时, 将键c对应值加1的操作;
                最终增强for循环结束后resultMap这个HashMap中存放的就是字母数字与其出现次数的键值对*/
            }
        }
        fileReader.close();
        bufferedReader.close();

        // 将统计结果存储到result.txt中
        File resultFile = new File("helloworld\\src\\result.txt");
        FileWriter resultWriter = new FileWriter(resultFile);
        for (Map.Entry<Character, Integer> entry : resultMap.entrySet()) {
            resultWriter.write(entry.getKey() + "=" + entry.getValue() + "\n");
        }
        resultWriter.close();
    }
}

